package com.imooc.bilibili.service;

import com.imooc.bilibili.dao.FileDao;
import com.imooc.bilibili.domain.File;
import com.imooc.bilibili.util.FastDFSUtil;
import com.imooc.bilibili.util.MD5Util;
import com.imooc.bilibili.util.OSSUtil;
import io.netty.util.internal.StringUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.Date;

@Service
public class FileService {

    @Autowired
    private FileDao fileDao;

    @Autowired
    private FastDFSUtil fastDFSUtil;

    @Autowired
    private OSSUtil ossUtil;

    public String uploadFileBySlices(MultipartFile slice, String fileMD5, Integer sliceNo, Integer totalSliceNo) throws Exception {
        // 通过文件MD5字符串获取该文件
        File dbFileMD5 = fileDao.getFileByMD5(fileMD5);
        // 如果该文件不为空，表示之前上传过该文件
        if (dbFileMD5 != null) {
            // 直接返回该文件的路径（秒传功能的精髓）
            return dbFileMD5.getUrl();
        }
        // 如果文件为空，则通过文件分片来上传一个文件
        String url = fastDFSUtil.uploadFileBySlices(slice, fileMD5, sliceNo, totalSliceNo);
        // 如果url不为空，说明文件上传成功，将文件相关信息添加到数据库中，方便下次查询使用
        if (!StringUtil.isNullOrEmpty(url)) {
            dbFileMD5 = new File();
            dbFileMD5.setCreateTime(new Date());
            dbFileMD5.setMd5(fileMD5);
            dbFileMD5.setUrl(url);
            dbFileMD5.setType(fastDFSUtil.getFileType(slice));
            fileDao.addFile(dbFileMD5);
        }
        return url;
    }

    /**
     * 获取文件的md5加密字符串
     *
     * @param file
     * @return
     * @throws Exception
     */
    public String getFileMD5(MultipartFile file) throws Exception {
        return MD5Util.getFileMD5(file);
    }

    public File getFileByMd5(String fileMd5) {
        return fileDao.getFileByMD5(fileMd5);
    }

    public String uploadFileBySlicesOss(MultipartFile slice, String fileMD5) {
        // 通过文件MD5字符串获取该文件
        File dbFileMD5 = fileDao.getFileByMD5(fileMD5);
        // 如果该文件不为空，表示之前上传过该文件
        if (dbFileMD5 != null) {
            // 直接返回该文件的路径（秒传功能的精髓）
            return dbFileMD5.getUrl();
        }
        // 如果文件为空，则通过文件分片来上传一个文件
        String url = ossUtil.uploadFileBySlices(slice, fileMD5);
        // 如果url不为空，说明文件上传成功，将文件相关信息添加到数据库中，方便下次查询使用
        if (!StringUtil.isNullOrEmpty(url)) {
            dbFileMD5 = new File();
            dbFileMD5.setCreateTime(new Date());
            dbFileMD5.setMd5(fileMD5);
            dbFileMD5.setUrl(url);
            dbFileMD5.setType(fastDFSUtil.getFileType(slice));
            // 将文件信息添加到数据库中
            fileDao.addFile(dbFileMD5);
        }
        return url;
    }
}
